Java Swing ๋ ์ด์์ ๊ด๋ฆฌ: ํจ์จ์ ์ธ ํ๋ฉด ๋ฐฐ์น ๋ฐฉ๋ฒ
์๋ฐ ์ค์(Java Swing)์ผ๋ก GUI๋ฅผ ๊ฐ๋ฐํ ๋ ๊ฐ์ฅ ์ด๋ ค์ด ๋ถ๋ถ ์ค ํ๋๊ฐ ์ปดํฌ๋ํธ๋ค์ ์ํ๋ ์์น์ ๋ฐฐ์นํ๋ ๊ฒ์ ๋๋ค. ์ค์์ ์ ๋ ์ขํ ๋์ **๋ ์ด์์ ๋งค๋์ (Layout Manager)**๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ฉด ํฌ๊ธฐ ๋ณํ์๋ ์ ์ฐํ๊ฒ ๋์ํฉ๋๋ค.
1. ์ฃผ์ ๋ ์ด์์ ๋งค๋์
์ค์์์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ด๋ฉด์ ์ค๋ฌด์ ์์ฃผ ์ฐ์ด๋ 3๊ฐ์ง ๋ ์ด์์์ ์ดํดํด์ผ ํฉ๋๋ค.
โ BorderLayout (๊ธฐ๋ณธ ๋ ์ด์์)
JFrame์ ๊ธฐ๋ณธ ๋ ์ด์์์ผ๋ก, ํ๋ฉด์ 5๊ฐ ๊ตฌ์ญ(๋ถ, ๋จ, ๋, ์, ์ค์)์ผ๋ก ๋๋๋๋ค.
- North, South: ๊ฐ๋ก๋ก ๊ธธ๊ฒ ๋ฐฐ์น๋ฉ๋๋ค.
- East, West: ์ธ๋ก๋ก ๊ธธ๊ฒ ๋ฐฐ์น๋ฉ๋๋ค.
- Center: ๋๋จธ์ง ์ ์ฒด ๊ณต๊ฐ์ ์ฐจ์งํ๋ฉฐ, ์ฐฝ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ ๋ ํจ๊ป ๋์ด๋ฉ๋๋ค.
JPanel panel = new JPanel(new BorderLayout());
panel.add(new JButton("๋ฉ๋ด"), BorderLayout.NORTH);
panel.add(new JButton("๋ก๊ทธ"), BorderLayout.SOUTH);
panel.add(new JTextArea(), BorderLayout.CENTER);โก FlowLayout
์ปดํฌ๋ํธ๋ฅผ ํ ์ค๋ก ์ฐจ๋ก๋๋ก ๋ฐฐ์นํฉ๋๋ค. ์ค์ด ๊ฝ ์ฐจ๋ฉด ์๋์ผ๋ก ๋ค์ ์ค๋ก ๋์ด๊ฐ๋๋ค. ๋ฒํผ๋ค์ ๋๋ํ ๋ฐฐ์นํ ๋ ์ฃผ๋ก ์ฐ์ ๋๋ค.
JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); // ์ฐ์ธก ์ ๋ ฌ
buttonPanel.add(new JButton("ํ์ธ"));
buttonPanel.add(new JButton("์ทจ์"));โข GridLayout
ํ๋ฉด์ ์ผ์ ํ ํฌ๊ธฐ์ ๊ฒฉ์(๋ฐ๋ํ) ํํ๋ก ๋๋๋๋ค. ๋ชจ๋ ์ปดํฌ๋ํธ์ ํฌ๊ธฐ๊ฐ ๋์ผํ๊ฒ ์ ์ง๋ฉ๋๋ค. ๊ณ์ฐ๊ธฐ ๊ฐ์ UI๋ฅผ ๋ง๋ค ๋ ์ต์ ์ ๋๋ค.
JPanel gridPanel = new JPanel(new GridLayout(3, 2)); // 3ํ 2์ด
gridPanel.add(new JButton("1"));
gridPanel.add(new JButton("2"));
// ... ๊ณ์ ์ถ๊ฐ2. ๋ณตํฉ ๋ ์ด์์ ์ ๋ต (Nested Panels)
ํ๋์ ๋ ์ด์์๋ง์ผ๋ก๋ ๋ณต์กํ ํ๋ฉด์ ๋ง๋ค ์ ์์ต๋๋ค. ๊ฐ์ฅ ์ค์ํ ๊ธฐ๋ฒ์ JPanel์ ์ค์ฒฉํด์ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค.
- Step 1: ๋ฉ์ธ ํ๋ ์์๋
BorderLayout์ ์ฌ์ฉํฉ๋๋ค. - Step 2: ๋จ์ชฝ(
SOUTH) ๊ตฌ์ญ์FlowLayout์ ๊ฐ์งJPanel์ ๋ฃ์ด ๋ฒํผ๋ค์ ๋ฐฐ์นํฉ๋๋ค. - Step 3: ์ค์(
CENTER) ๊ตฌ์ญ์GridLayout์ ๊ฐ์งJPanel์ ๋ฃ์ด ์ ๋ ฅ ํผ์ ๋ฐฐ์นํฉ๋๋ค.
3. ๋ ์ด์์ ๊ด๋ จ ์ค๋ฌด ํ
- Pack() ๋ฉ์๋:
frame.setSize()๋์frame.pack()์ ํธ์ถํ๋ฉด, ์ปดํฌ๋ํธ๋ค์ ๊ถ์ฅ ํฌ๊ธฐ(Preferred Size)์ ๋ง์ถฐ ์ฐฝ ํฌ๊ธฐ๊ฐ ์๋์ผ๋ก ์กฐ์ ๋ฉ๋๋ค. - Margin๊ณผ Padding: ์ปดํฌ๋ํธ ์ฌ์ด์ ์ฌ๋ฐฑ์ ์ฃผ๊ณ ์ถ๋ค๋ฉด
EmptyBorder๋ฅผ ํ์ฉํ๊ฑฐ๋, ๋ ์ด์์ ๋งค๋์ ์์ฑ ์ ๊ฐ๊ฒฉ(hgap, vgap)์ ์ค์ ํ์ธ์. - ์ปดํฌ๋ํธ ํฌ๊ธฐ ๊ณ ์ : ๋ ์ด์์ ๋งค๋์ ๊ฐ ์ปดํฌ๋ํธ ํฌ๊ธฐ๋ฅผ ๊ฐ์ ๋ก ์กฐ์ ํ๋ฏ๋ก,
setPreferredSize()๋ฅผ ์ฌ์ฉํ์ฌ ํํธ๋ฅผ ์ฃผ๋ ๊ฒ์ด ์ข์ต๋๋ค.
4. ์์ฝ
- ํ๋ฉด์ ํฐ ํ์ **
BorderLayout**์ผ๋ก ์ก์ต๋๋ค. - ์ธ๋ฐํ ๋ฐฐ์น๋
JPanel์ ์ค์ฒฉํ์ฌ ๊ฐ๊ฐ ๋ค๋ฅธ ๋ ์ด์์์ ์ ์ฉํฉ๋๋ค. - ์ ๋ ์ขํ(
setLayout(null))๋ ์ฐฝ ํฌ๊ธฐ ์กฐ์ ์ UI๊ฐ ๊นจ์ง๋ฏ๋ก ๊ฐ๊ธ์ ํผํด์ผ ํฉ๋๋ค.
์ ์ ํ ๋ ์ด์์ ์ ํ์ ์ ์ง๋ณด์๊ฐ ์ฌ์ด ๊น๋ํ UI์ ์์์ ๋๋ค.